gradient: Allow resolving with contexts
authorBenjamin Otte <otte@redhat.com>
Mon, 2 Jan 2012 14:44:27 +0000 (15:44 +0100)
committerBenjamin Otte <otte@redhat.com>
Mon, 9 Jan 2012 17:37:55 +0000 (18:37 +0100)
gtk/gtkgradient.c
gtk/gtkgradient.h

index 381586056622abf67c27927b4b8b2f44db8b3ef2..b3ba261693f07dc132ca2c049b24b652066bb18f 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "config.h"
 #include "gtkgradient.h"
+#include "gtkstylecontextprivate.h"
 #include "gtkstyleproperties.h"
 #include "gtkintl.h"
 
@@ -281,6 +282,44 @@ gtk_gradient_resolve (GtkGradient         *gradient,
   return TRUE;
 }
 
+cairo_pattern_t *
+gtk_gradient_resolve_for_context (GtkGradient     *gradient,
+                                  GtkStyleContext *context)
+{
+  cairo_pattern_t *pattern;
+  guint i;
+
+  g_return_val_if_fail (gradient != NULL, FALSE);
+  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), FALSE);
+
+  if (gradient->radius0 == 0 && gradient->radius1 == 0)
+    pattern = cairo_pattern_create_linear (gradient->x0, gradient->y0,
+                                           gradient->x1, gradient->y1);
+  else
+    pattern = cairo_pattern_create_radial (gradient->x0, gradient->y0,
+                                           gradient->radius0,
+                                           gradient->x1, gradient->y1,
+                                           gradient->radius1);
+
+  for (i = 0; i < gradient->stops->len; i++)
+    {
+      ColorStop *stop;
+      GdkRGBA rgba;
+
+      stop = &g_array_index (gradient->stops, ColorStop, i);
+
+      /* if color resolving fails, assume transparency */
+      if (!_gtk_style_context_resolve_color (context, stop->color, &rgba))
+        rgba.red = rgba.green = rgba.blue = rgba.alpha = 0.0;
+
+      cairo_pattern_add_color_stop_rgba (pattern, stop->offset,
+                                         rgba.red, rgba.green,
+                                         rgba.blue, rgba.alpha);
+    }
+
+  return pattern;
+}
+
 static void
 append_number (GString    *str,
                double      d,
index 7d5403023516e2aae1b7213cdc950d8782f56ff5..cb706bd1686fb64eebcaceb23ffd5537ec58e72b 100644 (file)
@@ -25,6 +25,7 @@
 #define __GTK_GRADIENT_H__
 
 #include <gdk/gdk.h>
+#include <gtk/gtkstylecontext.h>
 #include <gtk/gtkstyleproperties.h>
 #include <gtk/gtksymboliccolor.h>
 
@@ -55,6 +56,10 @@ void          gtk_gradient_unref          (GtkGradient         *gradient);
 gboolean      gtk_gradient_resolve        (GtkGradient         *gradient,
                                            GtkStyleProperties  *props,
                                            cairo_pattern_t    **resolved_gradient);
+cairo_pattern_t *
+              gtk_gradient_resolve_for_context
+                                          (GtkGradient         *gradient,
+                                           GtkStyleContext     *context);
 
 char *        gtk_gradient_to_string      (GtkGradient         *gradient);